package com.zzyl.nursing.controller.member;

import com.zzyl.common.core.controller.BaseController;
import com.zzyl.common.core.domain.AjaxResult;
import com.zzyl.nursing.dto.QueryDeviceDataListByDayDto;
import com.zzyl.common.core.page.TableDataInfo;
import com.zzyl.nursing.dto.AddElderDto;
import com.zzyl.nursing.dto.UserLoginRequestDto;
import com.zzyl.nursing.service.IDeviceDataService;
import com.zzyl.nursing.service.IDeviceService;
import com.zzyl.nursing.service.IFamilyMemberService;
import com.zzyl.nursing.vo.FamilyMemberVo;
import com.zzyl.nursing.vo.LoginVo;
import com.zzyl.nursing.vo.QueryDeviceDataListByDayVo;
import com.zzyl.nursing.vo.MemberListVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import kotlin.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 老人家属Controller
 *
 * @author ruoyi
 * @date 2024-09-19
 */
@RestController
@RequestMapping("/member/user")
@Api(tags = "老人家属的接口")
@Slf4j
public class FamilyMemberController extends BaseController
{
    @Autowired
    private IFamilyMemberService familyMemberService;

    @Resource
    private IDeviceService deviceService;

    @PostMapping("/login")
    @ApiOperation("小程序登录")
    public AjaxResult login(@RequestBody UserLoginRequestDto dto) {
        LoginVo loginVo = familyMemberService.login(dto);
        return success(loginVo);
    }
    /*
     * 按天统计
     *
     * */
    @GetMapping("/queryDeviceDataListByDay")
    @ApiOperation("按天统计查询指标数据")
    public AjaxResult queryDeviceDataListByDay(QueryDeviceDataListByDayDto dto){
        List<QueryDeviceDataListByDayVo> vo = familyMemberService.queryDeviceDataListByDay(dto);

        // 添加功能：每3小时数据求平均值处理
        // 0点-3点的数据求平均赋值给0点，3点-6点的数据求平均赋值给3点，以此类推
        List<QueryDeviceDataListByDayVo> processedVo = processThreeHourAverage(vo);

        //返回值多了一个operationTime，AjaxResult是hashmap可以动态的添加属性，不影响其他的接口操作
        return success(processedVo).put("operationTime", LocalDateTime.now());
    }

    /**
     * 处理每3小时数据求平均值
     * 将每3小时的数据求平均值，并赋值给该时间段的起始小时
     * 例如：0点-3点的数据求平均赋值给0点，3点-6点的数据求平均赋值给3点
     *
     * @param originalData 原始24小时数据
     * @return 处理后的数据（每3小时一个平均值，其余时间点数据为0或保持原值）
     */
    private List<QueryDeviceDataListByDayVo> processThreeHourAverage(List<QueryDeviceDataListByDayVo> originalData) {
        log.info("开始处理每3小时数据求平均值，原始数据条数: {}", originalData.size());

        // 创建新的结果列表
        List<QueryDeviceDataListByDayVo> processedData = new ArrayList<>();

        // 按3小时为一组进行处理
        for (int i = 0; i < originalData.size(); i += 3) {
            // 计算当前3小时组的平均值
            double sum = 0.0;
            int count = 0;
            int groupStartIndex = i;

            // 收集当前3小时组的数据（最多3个小时）
            for (int j = i; j < Math.min(i + 3, originalData.size()); j++) {
                QueryDeviceDataListByDayVo currentData = originalData.get(j);
                if (currentData.getDataValue() != null) {
                    sum += currentData.getDataValue();
                    count++;
                }
            }

            // 计算平均值
            double averageValue = count > 0 ? Math.round(sum / count * 10.0) / 10.0 : 0.0;

            // 记录日志
            String startTime = originalData.get(groupStartIndex).getDateTime();
            String endTime = originalData.get(Math.min(groupStartIndex + 2, originalData.size() - 1)).getDateTime();
            log.info("时间段 {}-{}: 原始数据条数={}, 总和={}, 平均值={}",
                    startTime, endTime, count, sum, averageValue);

            // 为当前3小时组创建数据项
            for (int j = i; j < Math.min(i + 3, originalData.size()); j++) {
                QueryDeviceDataListByDayVo newData = new QueryDeviceDataListByDayVo();
                newData.setDateTime(originalData.get(j).getDateTime());

                if (j == i) {
                    // 第一个小时：设置为3小时平均值
                    newData.setDataValue(averageValue);
                    log.debug("设置 {} 点的值为3小时平均值: {}", newData.getDateTime(), averageValue);
                } else {
                    // 其他小时：设置为0（或者可以选择保持原值）
                    newData.setDataValue(0.0);
                    log.debug("设置 {} 点的值为: 0.0", newData.getDateTime());
                }

                processedData.add(newData);
            }
        }

        log.info("每3小时数据求平均值处理完成，处理后数据条数: {}", processedData.size());
        return processedData;
    }

    @GetMapping("/queryDeviceDataListByWeek")
    @ApiOperation("按周统计查询指标数据")
    public AjaxResult queryDeviceDataListByWeek(QueryDeviceDataListByDayDto dto){
        List<QueryDeviceDataListByDayVo> vo = familyMemberService.queryDeviceDataListByWeek(dto);
        //返回值多了一个operationTime，AjaxResult是hashmap可以动态的添加属性，不影响其他的接口操作
        return success(vo).put("operationTime", LocalDateTime.now());
    }

    /**
     * 绑定老人
     */
    @PostMapping("/add")
    @ApiOperation("绑定老人")
    public AjaxResult add(@RequestBody AddElderDto addElderDto){
        try {
            familyMemberService.add(addElderDto);
            return AjaxResult.success();
        }catch (Exception e){
            return AjaxResult.error(e.getMessage());
        }

    }
    @GetMapping("/my")
    @ApiOperation("查询家人列表")
    public AjaxResult selectAll(){
        try {
            List<FamilyMemberVo> list = familyMemberService.selectAll();
            return success(list);
        } catch (Exception e) {
            return error(e.getMessage());
        }
    }
    @ApiOperation("分页查询老人列表")
    @GetMapping("/list-by-page")
    public AjaxResult listByPage(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize
    ) {
        // 设置分页参数
        startPage();
        // 调用服务层方法
        return AjaxResult.success(familyMemberService.listByPage());

    }

    @ApiOperation("解绑老人")
    @DeleteMapping("/deleteById")
    public AjaxResult deleteElder(@RequestParam Long id ){
        log.info("id:{}",id);
        int i =familyMemberService.deleteElder(id);
        return AjaxResult.success(i);
    }
    @ApiOperation("查询健康数据")
    @GetMapping("/queryServiceProperties/{iotId}")
    public AjaxResult queryHealthData(@ApiParam(value = "设备ID", required = true)
                                      @PathVariable("iotId") String iotId){
        // 添加参数验证，防止空值导致的异常
        if (iotId == null || iotId.trim().isEmpty()) {
            log.warn("查询健康数据失败：设备ID为空");
            return AjaxResult.error("设备ID不能为空");
        }

        // 添加异常处理，提高接口稳定性
        try {
            return deviceService.queryServiceProperty(iotId.trim());
        } catch (Exception e) {
            log.error("查询健康数据异常，设备ID: {}, 错误信息: {}", iotId, e.getMessage(), e);
            return AjaxResult.error("查询健康数据失败，请稍后重试");
        }
    }


}